/*
 * app_hub_api.h
 *
 *  Created on: 2023年7月19日
 *      Author: HXF
 */

#ifndef APP_HUB_API_H_
#define APP_HUB_API_H_

#include "app_hub_api_event_link.h"
#include "app_hub_api_usart_event.h"
#include "app_hub_api_rf_event.h"
#include "app_hub_api_def.h"
/**
 * @brief DS_hub_api_init 创建链表、初始化标志位信息等
 * @param none
 * @return none
 */
void DS_hub_api_init(void);

//----------------串口收----------------//
/**
 * @brief DS_hub_api_usart_listen 主循环里调用，从串口队列里获取数据，组成报文
 * @param none
 * @return none
 */
void DS_hub_api_usart_listen(void);

/**
 * @brief DS_hub_api_usart_msg_parse 串口队列里收到的字节，按照报文格式解析，打包成hub_api_usart_msg_t
 * 格式结构体
 * @param data 串口队列里收到的字节
 *        ptr_pkt 解析成功之后，打包的hub_api_usart_msg_t格式报文
 * @return 0 解析成功； 1 正在解析；2 LEN的内容错误； 3 CRC错误； 4 帧尾错误；
 */
int DS_hub_api_usart_msg_parse(unsigned char data, hub_api_usart_msg_t *ptr_pkt);

/**
 * @brief DS_hub_api_creat_usart_rx_event 打包usart rx event事件，推到队列
 * @param ptr_pkt, hub_api_usart_msg_t类型结构体
 * @return 0：正常；其他：异常
 * @note 不能在中断里调用
 */
int DS_hub_api_creat_usart_rx_event(const hub_api_usart_msg_t *ptr_pkt);

/**
 * @brief DS_hub_api_get_usart_rx_event 从队列里获取usart rx event事件
 * @param ptr_pkt, hub_api_rx_evt_t类型结构体
 * @return 0：正常；其他：异常
 * @note 不能在中断里调用
 */
int DS_hub_api_get_usart_rx_event(hub_api_rx_evt_t *ptr_pkt);

/**
 * @brief DS_hub_api_usart_rx_event_task 主循环里调用，usart rx event处理任务
 * @param none
 * @return none
 */
void DS_hub_api_usart_rx_event_task(void);

//----------------串口发----------------//

/**
 * @brief DS_hub_api_creat_hub_event 打包usart tx event HUB自身事件，推送给HUB_API处理
 * @param evt_type 事件类型
 *        data 事件内容
 *        len data长度
 * @return 无
 * @note 不能在中断里调用
 */
void DS_hub_api_creat_hub_event(HUB_API_HUB_EVT_TYPE_E evt_type,
                                unsigned char *data, int len);

/**
 * @brief DS_hub_api_creat_rfm_event 打包usart tx event RFM外设事件，推送给HUB_API处理
 * @param rfmid： RFM ID
 *        rollingcode
 *        rssi：
 *        dbginfo：debug信息
 *        cmd：
 *        payload：
 *        payload_len payload的字节数
 * @return 无0：正常；其他：异常
 * @note 不能在中断里调用
 */
void DS_hub_api_creat_rfm_event(unsigned char rfmid,
                                unsigned char rollingcode[4],
                                unsigned char rssi,
                                unsigned char dbginfo[2],
                                unsigned char cmd,
                                unsigned char *payload,
                                unsigned char payload_len);

/**
 * @brief DS_hub_api_creat_file_event 打包usart tx event 文件传输事件，推送给HUB_API处理
 * @param evt_type 事件类型
 *        data 事件内容
 *        len data长度
 * @return 无
 * @note 不能在中断里调用
 */
void DS_hub_api_creat_file_event(HUB_API_FILE_EVT_TYPE_E evt_type,
                                unsigned char *data, int len);

/**
 * @brief DS_hub_api_P2P_do_finish 点对点操作之后，成功/失败结果
 * @param rfmid
 *        result， 0，成功，1失败
 *        keyvalue， 点对点操作的物模型数组，含key值，
 *        keyvalue_len 物模型数组buf
 * @return 无
 */
void DS_hub_api_P2P_do_finish(unsigned char rfmid,
                           unsigned char result,
                           unsigned char *keyvalue, int keyvalue_len);

/**
 * @brief DS_hub_api_usart_tx_event_task 主循环里调用，usart tx event处理任务
 * @param none
 * @return none
 */
void DS_hub_api_usart_tx_event_task(void);

void DS_hub_api_task(void);

void hub_api_test(void);

#endif /* APP_HUB_API_H_ */
